package framework.service {

	/**
	 * @author Charlie MacIsaac
	 */
	
	public class BlitRetrieverService implements IRetrieverService {
		// PROPERTIES =============================================================================
		[Inject]	public var parser : IParser;
		[Inject]	public var jsonLoader : LoaderSignalsWrapper;
		[Inject]	public var imageLoader : LoaderSignalsWrapper;
		[Inject]	public var dataStore : RetrievalDataStore;
		
		private var _name : String;
		private var _dataToParse : Object;
		private var _blitRecieverCallBack : Function;
		
		// GETTERS + SETTERS ======================================================================
		// CONSTRUCTOR ============================================================================
		public function BlitRetrieverService() {
			jsonLoader = new LoaderSignalsWrapper();
			imageLoader = new LoaderSignalsWrapper();
			
			_dataToParse = new Object();
		}
		
		// PUBLIC =================================================================================
		public function retrieve(name : String, receiver : Function) : void {
			if (dataStore.retrieve(name)) {
				receiver(dataStore.retrieve(name));
			} else {
				_name = name;
				_blitRecieverCallBack = receiver;
				
				loadRequiredFiles(_name);
			}
		}
		
		// PRIVATE ================================================================================
		private function loadRequiredFiles(name : String) : void {
			jsonLoader.complete.addOnce(jsonLoadCompleteHandler);
			jsonLoader.load(name + ".json");
			
			imageLoader.complete.addOnce(imageLoadCompleteHandler);
			imageLoader.load(name + ".png");
		}
		
		private function parseData() : void {
			if (_dataToParse.json && _dataToParse.image && _blitRecieverCallBack != null) {
				var parsedData : Object = parser.parse(_dataToParse);
				dataStore.store(_name, parsedData);
				_blitRecieverCallBack(parsedData);
			}
		}
		
		// LISTENERS ==============================================================================
		private function jsonLoadCompleteHandler(loadedObject : Object) : void {
			_dataToParse.json = loadedObject;
			parseData();
		}
		
		private function imageLoadCompleteHandler(loadedObject : Object) : void {
			_dataToParse.image = loadedObject;
			parseData();
		}
	}
}